package org.apache.dubbo.registry.client.metadata.proxy;

import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.extension.SPI;
import org.apache.dubbo.metadata.MetadataService;
import org.apache.dubbo.registry.client.ServiceInstance;

import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;

/**
 * A factory to create a {@link MetadataService} proxy
 *
 * @see ServiceInstance
 * @see MetadataService
 * @since 2.7.5
 */
@SPI(DEFAULT_METADATA_STORAGE_TYPE)
public interface MetadataServiceProxyFactory {

    /**
     * Create a {@link MetadataService} proxy via the specified {@link ServiceInstance}
     *WritableMetadataService
     * @param serviceInstance the instance of {@link ServiceInstance}
     * @return non-null
     */
    MetadataService getProxy(ServiceInstance serviceInstance);

    /**
     * Get the default extension of {@link MetadataServiceProxyFactory}
     *
     * @return non-null
     */
    static MetadataServiceProxyFactory getDefaultExtension() {
        return ExtensionLoader.getExtensionLoader(MetadataServiceProxyFactory.class)
                .getDefaultExtension();
    }

    static MetadataServiceProxyFactory getExtension(String name) {
        return ExtensionLoader.getExtensionLoader(MetadataServiceProxyFactory.class)
                .getExtension(name);
    }
}
